package com.sentinel.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    // res_test 资源名称需要与 sentinel 控制台资源名称一致
    @SentinelResource(value = "res_test",fallback = "fallbackHandler",blockHandler = "exceptionHandler")
    @GetMapping("/test")
    public String test() {
        return "hello sentinel";
    }

    // 熔断与降级处理
    /**
     * 对应处理 BlockException 的函数名称，可选项。若未配置，则将 BlockException 直接抛出。blockHandler 函数访问范围需要是 public，返回类型需要与原方法相匹配，参数类型需要和原方法相匹配并且最后加一个额外的参数，类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数，则可以指定 blockHandlerClass 为对应的类的 Class 对象，注意对应的函数必需为 static 函数，否则无法解析
     */
    public String fallbackHandler() {
        return "sentinel 接口熔断与降级处理";
    }

    // 限流与阻塞处理
    // 注意：fallback 函数的访问范围需要是 public，参数类型和返回类型都需要与原方法相匹配，并且需要和原方法在同一个类中。业务异常不会进入 fallback 逻辑
    public String exceptionHandler(FlowException ex) {
        return "sentinel 限流与阻塞处理";
    }
}
